package main

import (
	"github.com/natefinch/lumberjack"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"net/http"
)

//var logger *zap.Logger      // 这里用sugarlogger代替了logger

var sugarLogger *zap.SugaredLogger

func main() {
	InitLogger()
	defer sugarLogger.Sync()
	for i := 0; i < 10000; i++ {
		sugarLogger.Info("测试切割，分段是否可用")
	}
	simpleHttpGet("www.baidu.com")
	simpleHttpGet("https://www.baidu.com")
}

/*func InitLogger() {
	// 	这里是原生的zap_logger日志
	logger, _ = zap.NewProduction()
	logger, _ = zap.NewDevelopment()//终端日志
	sugarLogger = logger.Sugar()
	zap.New()
}*/

func InitLogger() {
	writeSyncer := getLogWriter()
	encoder := getEncoder()
	core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel) //根据3要素造一个core，将core传递到New()中，造一个logger

	//logger := zap.New(core) // 没有函数调用方信息
	logger := zap.New(core, zap.AddCaller()) // 添加了函数调用方信息
	sugarLogger = logger.Sugar()
}

func getEncoder() zapcore.Encoder {
	//return zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()) // 返回的是json格式 键值对形式日志
	encoderConfig := zapcore.EncoderConfig{
		TimeKey:       "ts",
		LevelKey:      "level",
		NameKey:       "logger",
		CallerKey:     "caller",
		FunctionKey:   zapcore.OmitKey,
		MessageKey:    "msg",
		StacktraceKey: "stacktrace",
		LineEnding:    zapcore.DefaultLineEnding,
		EncodeLevel:   zapcore.LowercaseLevelEncoder,
		//EncodeTime:     zapcore.EpochTimeEncoder, //人类不可读时间
		EncodeTime:     zapcore.ISO8601TimeEncoder, //人类可读时间
		EncodeDuration: zapcore.SecondsDurationEncoder,
		EncodeCaller:   zapcore.ShortCallerEncoder,
	}
	return zapcore.NewConsoleEncoder(encoderConfig)
	//return zapcore.NewConsoleEncoder(zap.NewProductionEncoderConfig()) // 返回的是普通的输出流形式日志，有空格，这行注释了，使用上面结构体形式
}

/*func getLogWriter() zapcore.WriteSyncer {
	// file, _ := os.Create("./test.log") // create 每次都会打开一个新的日志文件，不是追加形式
	file, _ := os.OpenFile("./test.log", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0744) //追加日志
	return zapcore.AddSync(file)
}*/ // 旧版logger，新版使用第三方的一个lumberjack库

//新版使用第三方的一个logger库
func getLogWriter() zapcore.WriteSyncer {
	lumberJackLogger := &lumberjack.Logger{
		Filename:   "./test.log",
		MaxSize:    1,     // 最大多少M
		MaxBackups: 5,     // 最大备份数量
		MaxAge:     30,    // 最大备份天数
		Compress:   false, // 是否压缩
	}
	return zapcore.AddSync(lumberJackLogger)
}
func simpleHttpGet(url string) {
	resp, err := http.Get(url)
	if err != nil {
		sugarLogger.Error(
			"Error fetching url..",
			zap.String("url", url),
			zap.Error(err))
	} else {
		sugarLogger.Info("Success..",
			zap.String("statusCode", resp.Status),
			zap.String("url", url))
		resp.Body.Close()
	}
}
